package leetcode101.bit_operation;

import java.util.Scanner;

/**
 * @author Synhard
 * @version 1.0
 * @class Code10
 * @description 476. 数字的补数
 * 给你一个 正整数 num ，输出它的补数。补数是对该数的二进制表示取反。
 * 示例 1：
 *
 * 输入：num = 5
 * 输出：2
 * 解释：5 的二进制表示为 101（没有前导零位），其补数为 010。所以你需要输出 2 。
 * 示例 2：
 *
 * 输入：num = 1
 * 输出：0
 * 解释：1 的二进制表示为 1（没有前导零位），其补数为 0。所以你需要输出 0 。
 *
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-05-07 14:28
 */
public class Code10 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        System.out.println(findComplement(num));
    }

    public static int findComplement(int num) {
        int tag = 0;
        for (int i = 30; i > -1; i--) {
            if (((num >> i) & 1) == 1) {
                tag = i + 1;
                break;
            }
        }
        if (tag == 0) {
            num = Integer.MAX_VALUE;
        }
        for (int i = tag - 1; i > -1; i--) {
            if (((num >> i) & 1) == 1) {
                num -= 1 << i;
            } else {
                num += 1 << i;
            }
        }
        return num;
    }
}
